20 注解

注解

APT实现注解处理器

除了使用反射实现注解处理器,还可以使用APT来实现?

什么是APT?和反射比起来有什么区别?

APT:注解处理工具,属于编译时期处理注解的工具。
和反射处理注解比起来:

  1. 因为发生在编译时期,性能比反射高一些。
  2. 比较重要的用途是用来生成新的代码。
  3. 使用起来比反射要复杂一些,尤其是在生成新代码的时候,最好结合JavaPoet来使用。
  4. 代码需要指定处理器手动调用编译器进行编译。

TIJ中的APT方法已在JAVA6加入到JDK中,从网上找到的使用方法如下:

[JAVA apt使用语法]https://www.jianshu.com/p/07ef8ba80562
[JAVA apt使用语法] https://juejin.im/post/584d4aa00ce463005c5dbc36
[JavaPoet使用指南] https://juejin.im/post/584d4b5b0ce463005c5dc444

可以结合访问者模式来优化实现方案:

什么是访问者模式?

参考:[访问者模式]https://blog.csdn.net/qq_24451605/article/details/51151985

  • Visitor:抽象访问者,在重载的visit函数中声明访问者可以访问的对象。
  • Concrete Visitor:实现一个访问者对于一个具体的元素的操作
  • Element:抽象元素,声明具有访问该类型元素权限的访问者的类型(一般是抽象类型),提供重载的accept函数赋予权限
  • Concrete Element:实现accept方法,基本上是模板化的visitor.visit(this)
  • Object Structure:容纳多种类型或许不同,接口或者不同的元素的集合。

  • 封装一些作用于数据结构中的各元素的操作,不同的操作可以借助新的visitor实现,降低了操作间的耦合性

  • 访问者可以将数据结构和对数据的操作解耦,使得增加对数据结构的操作不需要取修改数据结构,也不必去修改原有的操作,而执行时再定义新的Visitor时闲着就行了(在操作添加上易拓展)

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
abstract class Student {

private String name;
private String university;
private String rating;

public abstract void accept(Visitor visitor);
}
}

class Bachelor extends Student{

@Override
public void accept( Visitor visitor ) {
visitor.visit( this );
}
}

class College extends Student{

@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}

interface Visitor{
public void visit ( Bachelor bachelor );
public void visit ( College college );
}

class ShowVisitor implements Visitor {

@Override
public void visit(Bachelor bachelor) {
System.out.println("A bachelor\n");
}

@Override
public void visit(College college) {
System.out.println(" a college student!\n");
}
}

class SumVisitor implements Visitor{

private int totalBachelor;

SumVisitor(){
super();
totalBachelor = 0;
}

@Override
public void visit(Bachelor bachelor) {
totalBachelor++;
}

@Override
public void visit(College college) {
}

public int getTotal_bachelor() {
return totalBachelor;
}
}

可以看到,这里访问者模式运用到了我们这之前学过的JAVA多路分派的方法。

使用访问者模式的优劣?

看一个普通的案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
abstract class Student {

private String name;
private String university;
private String rating;

}

class Bachelor extends Student{

public abstract void show(){
System.out.println("A bachelor\n");
}

private int totalBachelor;

public void void sum(){
totalBachelor++;
}

public int getTotal_bachelor() {
return totalBachelor;
}
}

class College extends Student{

public void show(Visitor visitor) {
System.out.println(" a college student!\n");
}
}

相比,使用了访问者模式的优势在于:

  1. 解决数据结构与数据操作分离的问题,避免某些操作污染数据对象类,符合单一职责原则,功能上具有良好的拓展性。
  2. 当我需要对某个数据结构新增一种操作逻辑的时候,需要新增一个访问者,这样的好处是维护的时候不需要再数据对象中浏览大量的操作逻辑来寻找,其次,当访问者或者数据结构的对象越来越多,代码就会越来越乱,维护起来也越来越不方便。
    劣势在于:
  3. 没有面向接口编程,违反了依赖倒置原则,类之间的耦合增加,为类的修改带了麻烦。

本文标题:20 注解

文章作者:Sun

发布时间:2018年11月26日 - 11:11

最后更新:2018年12月12日 - 16:12

原始链接:https://sunyi720.github.io/2018/11/26/THING IN JAVA/20 注解/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。